﻿package mortal.game.scene3D.map3D.AstarAnyDirection.processor
{
    import __AS3__.vec.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.data.*;

    public class MapGridTurnPointFixer extends Object
    {

        public function MapGridTurnPointFixer()
        {
            return;
        }// end function

        public static function fix(param1:Array, param2:Array, param3:int, param4:int = 10, param5:int = 80) : Array
        {
            var _loc_7:int = 0;
            var _loc_8:int = 0;
            var _loc_9:AstarTurnPoint = null;
            var _loc_10:AstarTurnPoint = null;
            var _loc_11:int = 0;
            var _loc_12:int = 0;
            var _loc_13:int = 0;
            var _loc_14:int = 0;
            var _loc_15:int = 0;
            var _loc_16:int = 0;
            var _loc_17:Number = NaN;
            var _loc_19:Vector.<int> = null;
            var _loc_20:int = 0;
            var _loc_21:int = 0;
            var _loc_22:int = 0;
            var _loc_23:Boolean = false;
            var _loc_24:int = 0;
            var _loc_25:int = 0;
            if (param2.length == 1)
            {
                return param2;
            }
            param2 = preFix(param2, param4);
            var _loc_6:* = param2.length;
            _loc_7 = 1;
            while (_loc_7 < _loc_6)
            {
                
                _loc_9 = param2[_loc_7];
                _loc_9.distance = Number.MAX_VALUE;
                _loc_7++;
            }
            _loc_9 = param2[0];
            _loc_9.distance = 0;
            _loc_7 = 0;
            while (_loc_7 < (_loc_6 - 1))
            {
                
                _loc_10 = param2[_loc_7];
                _loc_11 = _loc_10._y;
                _loc_12 = _loc_10._x;
                _loc_8 = _loc_7 + 1;
                while (_loc_8 < _loc_6)
                {
                    
                    _loc_9 = param2[_loc_8];
                    _loc_13 = _loc_9._y;
                    _loc_14 = _loc_9._x;
                    if (Math.abs(_loc_13 - _loc_11) + Math.abs(_loc_14 - _loc_12) > param5)
                    {
                        break;
                    }
                    _loc_19 = GeomUtil.calcLinePassGridesFastMidle(_loc_11, _loc_12, _loc_13, _loc_14);
                    _loc_20 = 0;
                    _loc_21 = _loc_19.length;
                    _loc_23 = true;
                    if (_loc_8 != (_loc_7 + 1))
                    {
                        _loc_20 = 0;
                        while (_loc_20 < (_loc_21 - 1))
                        {
                            
                            _loc_24 = _loc_19[_loc_20];
                            _loc_25 = _loc_19[(_loc_20 + 1)];
                            if (param1[_loc_24] == null)
                            {
                                _loc_23 = false;
                                break;
                            }
                            _loc_22 = param1[_loc_24][_loc_25];
                            if (_loc_22 >= 0)
                            {
                                if (_loc_22 < param3)
                                {
                                    _loc_23 = false;
                                    break;
                                }
                            }
                            _loc_20 = _loc_20 + 2;
                        }
                    }
                    if (_loc_23)
                    {
                        _loc_15 = _loc_14 - _loc_12;
                        _loc_16 = _loc_13 - _loc_11;
                        _loc_17 = Math.sqrt(_loc_15 * _loc_15 + _loc_16 * _loc_16);
                        if (_loc_10.distance + _loc_17 < _loc_9.distance)
                        {
                            _loc_9.distance = _loc_10.distance + _loc_17;
                            _loc_9.parent = _loc_10;
                        }
                    }
                    _loc_8++;
                }
                _loc_7++;
            }
            var _loc_18:Array = [];
            _loc_9 = param2[(_loc_6 - 1)];
            while (_loc_9 != null)
            {
                
                _loc_18.unshift(_loc_9);
                _loc_9 = _loc_9.parent;
            }
            return _loc_18;
        }// end function

        private static function preFix(param1:Array, param2:int = 20) : Array
        {
            var _loc_5:int = 0;
            var _loc_6:int = 0;
            var _loc_7:Number = NaN;
            var _loc_8:Number = NaN;
            var _loc_9:AstarTurnPoint = null;
            var _loc_10:AstarTurnPoint = null;
            var _loc_11:Number = NaN;
            var _loc_12:int = 0;
            var _loc_13:AstarTurnPoint = null;
            var _loc_3:Array = [];
            var _loc_4:* = param1.length;
            _loc_5 = 0;
            while (_loc_5 < (param1.length - 1))
            {
                
                _loc_9 = param1[_loc_5];
                _loc_3.push(_loc_9);
                _loc_10 = param1[(_loc_5 + 1)];
                _loc_11 = GeomUtil.calcDistance2(_loc_9, _loc_10);
                _loc_12 = int(_loc_11 / param2);
                if (_loc_12 < 1)
                {
                }
                else
                {
                    _loc_12++;
                    _loc_7 = (_loc_10._x - _loc_9._x) / _loc_12;
                    _loc_8 = (_loc_10._y - _loc_9._y) / _loc_12;
                    _loc_6 = 1;
                    while (_loc_6 < _loc_12)
                    {
                        
                        _loc_13 = new AstarTurnPoint();
                        _loc_13._x = int(_loc_9._x + _loc_7 * _loc_6);
                        _loc_13._y = int(_loc_9._y + _loc_8 * _loc_6);
                        _loc_3.push(_loc_13);
                        _loc_6++;
                    }
                }
                _loc_5++;
            }
            if (_loc_10 != null)
            {
                _loc_3.push(_loc_10);
            }
            return _loc_3;
        }// end function

    }
}
